enableremote: Allow type= to be provided when it does not change the type of the...
authorJoey Hess <joeyh@joeyh.name>
Mon, 29 Sep 2025 14:40:10 +0000 (10:40 -0400)
committerJoey Hess <joeyh@joeyh.name>
Mon, 29 Sep 2025 14:40:10 +0000 (10:40 -0400)
Fixes breakage in datalad test suite
https://github.com/datalad/datalad/issues/7747

Also, revert the change I earlier made to git-annex's own test suite due to
the same problem.

CHANGELOG
Command/EnableRemote.hs
Test.hs

index 1acce80c4fbcb7849043e64ecdcf7fb1d315c5b6..d61836f7c7aced8f8a8481b889f94904273f3830 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -2,6 +2,8 @@ git-annex (10.20250926) UNRELEASED; urgency=medium
 
   * Remove the Servant build flag; always build with support for
     annex+http urls and git-annex p2phttp.
+  * enableremote: Allow type= to be provided when it does not change the
+    type of the special remote.
 
  -- Joey Hess <id@joeyh.name>  Thu, 25 Sep 2025 13:36:21 -0400
 
index 875231d45893026ade98e17c52759281487969f6..f5fc2c67330efc681ed3e1538fde43542a201f51 100644 (file)
@@ -59,11 +59,9 @@ start _ [] = unknownNameError "Specify the remote to enable."
 start o (name:rest) = go =<< filter matchingname <$> Annex.getGitRemotes
   where
        matchingname r = Git.remoteName r == Just name
-       go [] = deadLast name $
-               let config = Logs.Remote.keyValToConfig Proposed rest
-               in case M.lookup SpecialRemote.typeField config of
-                       Nothing -> startSpecialRemote o name config
-                       Just _ -> giveup "Cannot change type= of existing special remote. Instead, use: git-annex initremote --sameas"
+       go [] = deadLast name $ 
+               startSpecialRemote o name $
+                       Logs.Remote.keyValToConfig Proposed rest
        go (r:_)
                | not (null rest) = go []
                | otherwise = do
@@ -105,6 +103,10 @@ startSpecialRemote' cname perform name config ((u, c, mcu):[]) =
        starting cname ai si $ do
                let fullconfig = config `M.union` c     
                t <- either giveup return (SpecialRemote.findType fullconfig)
+               case SpecialRemote.findType c of
+                       Right t' | t' /= t ->
+                               giveup "Cannot change type= of existing special remote. Instead, use: git-annex initremote --sameas"
+                       _ -> noop
                gc <- maybe (liftIO dummyRemoteGitConfig) 
                        (return . Remote.gitconfig)
                        =<< Remote.byUUID u
diff --git a/Test.hs b/Test.hs
index 4d8bebaa8d018d85556d40c8f75bbc261140ec6c..90e9afd29da288cdc45f66f246526fa511d629b1 100644 (file)
--- a/Test.hs
+++ b/Test.hs
@@ -1918,19 +1918,19 @@ test_gpg_crypto = do
   where
        testscheme scheme = intmpclonerepo $ test_with_gpg $ \gpgcmd environ -> do
                createDirectory (literalOsPath "dir")
-               let ps =
+               let initps =
                        [ "foo"
+                       , "type=directory"
                        , "encryption=" ++ scheme
                        , "directory=dir"
                        , "highRandomQuality=false"
                        ] ++ if scheme `elem` ["hybrid","pubkey"]
                                then ["keyid=" ++ Utility.Gpg.testKeyId]
                                else []
-               let initps = ps ++ [ "type=directory" ]
                git_annex' "initremote" initps (Just environ) "initremote"
                git_annex_shouldfail' "initremote" initps (Just environ) "initremote should not work when run twice in a row"
-               git_annex' "enableremote" ps (Just environ) "enableremote"
-               git_annex' "enableremote" ps (Just environ) "enableremote when run twice in a row"
+               git_annex' "enableremote" initps (Just environ) "enableremote"
+               git_annex' "enableremote" initps (Just environ) "enableremote when run twice in a row"
                git_annex' "get" [annexedfile] (Just environ) "get of file"
                annexed_present annexedfile
                git_annex' "copy" [annexedfile, "--to", "foo"] (Just environ) "copy --to encrypted remote"